﻿using BLevy.Entidad;
using BLevy.Negocio;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BLevy.UI
{
    public partial class frmPlan : Form
    {
        Utils.Numeros n = new Utils.Numeros();
        Regex numerico = new Regex(@"^(\d+(?:[\.\,]\d{2})?)$");

        private int plan_id { get; set; }
        private string operacion { get; set; }

        IList<AdicionalPlan> adicionalesL = new List<AdicionalPlan>();
        IList<int> adicionalesEliminar = new List<int>();

        public frmPlan()
        {
            InitializeComponent();
        }

        //constructor con paramentros (id_plan, operacion)
        public frmPlan(int _id, string _operacion)
        {
            plan_id = _id;
            operacion = _operacion;
            InitializeComponent();
        }

        private void frmPlan_Load(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(operacion))
            {
                inicializar();
            }
            else
            {
                GetPlan(plan_id);
            }
        }

        private void inicializar()
        {
            tabControl1.SelectTab("tabPage1");

            txtNombre.Text = string.Empty;
            txtDescripcion.Text = string.Empty;
            txtCostoBase.Text = string.Empty;
            chkActivo.CheckState = CheckState.Checked;
            chkRecargo.CheckState = CheckState.Checked;

            //TITULAR
            txtEdadTitular.Text = string.Empty;

            //CONYUGE
            chkConyuge.Checked = true;
            chkConyuge.Checked = false;
            txtEdadConyuge.Text = string.Empty;

            //HIJOS
            chkHijos.Checked = true;
            chkHijos.Checked = false;
            txtCantHijos.Text = string.Empty;
            txtEdadHijos.Text = string.Empty;

            //OTROS
            chkOtros.Checked = true;
            chkOtros.Checked = false;
            txtCantOtros.Text = string.Empty;
            txtEdadOtros.Text = string.Empty;

            nudEdadDesde.ResetText();
            nudEdadHasta.ResetText();
            txtCostoAdicional.Text = string.Empty;
            dgvCostosAdicionales.Rows.Clear();

            txtNombre.Focus();
        }

        private void GetPlan(int plan_id)
        {
            try
            {
                Plan plan = Planes.FindById(plan_id);
                txtNombre.Text = plan.nombre;
                txtDescripcion.Text = plan.descripcion;
                txtCostoBase.Text = plan.costo_base.ToString();
                chkActivo.Checked = Convert.ToBoolean(plan.activo);
                chkRecargo.Checked = Convert.ToBoolean(plan.recargo);

                txtEdadTitular.Text = plan.edad_titular.ToString();

                chkConyuge.Checked = Convert.ToBoolean(plan.conyuge);
                txtEdadConyuge.Text = plan.edad_conyuge.ToString();

                chkHijos.Checked = Convert.ToBoolean(plan.hijos);
                txtCantHijos.Text = plan.cantidad_hijos.ToString();
                txtEdadHijos.Text = plan.edad_hijos.ToString();

                chkOtros.Checked = Convert.ToBoolean(plan.otros);
                txtCantOtros.Text = plan.cantidad_otros.ToString();
                txtEdadOtros.Text = plan.edad_otros.ToString();

                GetAdicionales(plan_id);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void GetAdicionales(int plan_id)
        {
            try
            {
                IList<AdicionalPlan> adicional_plan = Planes.FindAdicionalesByPlan(plan_id);
                adicionalesL = adicional_plan.ToList();

                dgvCostosAdicionales.AutoGenerateColumns = false;

                foreach (var adicional in adicionalesL)
                {
                    //    adicional_plan = Planes.FindAdicionalesByPlan(plan_id);
                    //    _adherentes = adicional_plan.ToList();
                    dgvCostosAdicionales.Rows.Add(adicional.id, adicional.plan_id, adicional.edad_desde.ToString(), adicional.edad_hasta.ToString(), adicional.costo_adicional.ToString());
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void chkConyuge_CheckedChanged(object sender, EventArgs e)
        {
            if (chkConyuge.CheckState == CheckState.Checked)
            {
                txtEdadConyuge.Enabled = true;
                txtEdadConyuge.Text = string.Empty;
                txtEdadConyuge.Focus();
            }
            else
            {
                txtEdadConyuge.Enabled = false;
            }
        }

        private void chkHijos_CheckedChanged(object sender, EventArgs e)
        {
            if (chkHijos.CheckState == CheckState.Checked)
            {
                txtCantHijos.Enabled = true;
                txtEdadHijos.Enabled = true;
                txtCantHijos.Text = string.Empty;
                txtEdadHijos.Text = string.Empty;
                txtCantHijos.Focus();
            }
            else
            {
                txtCantHijos.Enabled = false;
                txtEdadHijos.Enabled = false;
            }
        }

        private void chkOtros_CheckedChanged(object sender, EventArgs e)
        {
            if (chkOtros.CheckState == CheckState.Checked)
            {
                txtCantOtros.Enabled = true;
                txtEdadOtros.Enabled = true;
                txtCantOtros.Text = string.Empty;
                txtEdadOtros.Text = string.Empty;
                txtCantOtros.Focus();
            }
            else
            {
                txtCantOtros.Enabled = false;
                txtEdadOtros.Enabled = false;
            }
        }

        private void btnAgregar_Click(object sender, EventArgs e)
        {
            errorAdicionales.Clear();

            AdicionalPlan _adicionalPlan = new AdicionalPlan();
            try
            {
                if (nudEdadDesde.Value >= 0 && nudEdadHasta.Value >= 0 && txtCostoAdicional.Text != string.Empty)
                {
                    if (nudEdadHasta.Value > nudEdadDesde.Value)
                    {

                        if (numerico.IsMatch(txtCostoAdicional.Text))
                        {
                            if (dgvCostosAdicionales.Rows.Count > 0)
                            {
                                bool existe = true;
                                foreach (DataGridViewRow fila in dgvCostosAdicionales.Rows)
                                {
                                    // si (fechadesde >= fila.fechadesde y fechadesde <= fila.fechahasta) o (fechahasta >= fila.fechahasta y fechahasta <= fila.fechahasta) o (fechadesde < fila.fechadesde y fechahasta > fila.fechahasta)

                                    if (!(((Convert.ToInt32(fila.Cells["EdadDesde"].Value) <= nudEdadDesde.Value) && (Convert.ToInt32(fila.Cells["EdadHasta"].Value) >= nudEdadDesde.Value)) ||
                                        ((Convert.ToInt32(fila.Cells["EdadDesde"].Value) <= nudEdadHasta.Value) && (Convert.ToInt32(fila.Cells["EdadHasta"].Value) >= nudEdadHasta.Value)) ||
                                        ((Convert.ToInt32(fila.Cells["EdadDesde"].Value) > nudEdadDesde.Value) && (Convert.ToInt32(fila.Cells["EdadHasta"].Value) < nudEdadHasta.Value))))
                                    {
                                        existe = false;
                                    }
                                    else
                                    {
                                        existe = true;
                                        break;
                                    }
                                }

                                if (existe)
                                {
                                    errorAdicionales.SetError(txtCostoAdicional, "Ya existe un registro adicional para el rango de edades ingresado.");
                                }
                                else
                                {
                                    dgvCostosAdicionales.Rows.Add(0, 0, nudEdadDesde.Value, nudEdadHasta.Value, n.AgregarDecimales(txtCostoAdicional.Text));
                                    _adicionalPlan.id = 0;
                                    _adicionalPlan.plan_id = 0;
                                    _adicionalPlan.edad_desde = Convert.ToInt32(nudEdadDesde.Value);
                                    _adicionalPlan.edad_hasta = Convert.ToInt32(nudEdadHasta.Value);
                                    _adicionalPlan.costo_adicional = Convert.ToDouble(n.AgregarDecimales(txtCostoAdicional.Text));
                                    adicionalesL.Add(_adicionalPlan);
                                    LimpiarAdicionales();
                                }
                            }
                            else
                            {
                                dgvCostosAdicionales.Rows.Add(0, 0, nudEdadDesde.Value, nudEdadHasta.Value, n.AgregarDecimales(txtCostoAdicional.Text));
                                _adicionalPlan.id = 0;
                                _adicionalPlan.plan_id = 0;
                                _adicionalPlan.edad_desde = Convert.ToInt32(nudEdadDesde.Value);
                                _adicionalPlan.edad_hasta = Convert.ToInt32(nudEdadHasta.Value);
                                _adicionalPlan.costo_adicional = Convert.ToDouble(n.AgregarDecimales(txtCostoAdicional.Text));
                                adicionalesL.Add(_adicionalPlan);
                                LimpiarAdicionales();
                            }
                        }
                        else
                        {
                            errorAdicionales.SetError(txtCostoAdicional, "El campo Costo Adicional debe ser un número válido.");
                        }
                    }
                    else
                    {
                        errorAdicionales.SetError(nudEdadHasta, "El campo Edad Hasta debe ser mayor a la Edad Desde.");
                    }
                }
                else
                {
                    errorAdicionales.SetError(txtCostoAdicional, "Los campos de Costos Adicionales no pueden ser vacios.");
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Error : " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void LimpiarAdicionales()
        {
            nudEdadDesde.ResetText();
            nudEdadHasta.ResetText();
            txtCostoAdicional.Text = string.Empty;
            nudEdadDesde.Focus();
        }

        private void dgvCostosAdicionales_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 5)
            {
                int id = Convert.ToInt32(dgvCostosAdicionales.Rows[e.RowIndex].Cells["id"].Value);

                if (id != 0)
                {
                    adicionalesEliminar.Add(id);
                }

                dgvCostosAdicionales.Rows.RemoveAt(e.RowIndex);

                var itemToRemove = adicionalesL.SingleOrDefault(r => r.id == id);
                if (itemToRemove != null)
                    adicionalesL.Remove(itemToRemove);
            }
        }

        private void dgvCostosAdicionales_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            // -- HABILITAR CELDA COSTO ADICIONAL --
            string headerText = dgvCostosAdicionales.Columns[e.ColumnIndex].HeaderText;

            // Abort validation if cell is not in the CompanyName column.
            if (!headerText.Equals("Costo Adicional")) return;
            else
            {
                if (e.RowIndex > -1)
                {
                    dgvCostosAdicionales.Rows[e.RowIndex].Cells["Costo"].ReadOnly = false;
                }
            }
            // ----------------------------------------------
        }

        private void dgvCostosAdicionales_CellEndEdit(object sender, DataGridViewCellEventArgs e)
        {
            string headerText = dgvCostosAdicionales.Columns[e.ColumnIndex].HeaderText;

            // Abort validation if cell is not in the CompanyName column.
            if (!headerText.Equals("Costo Adicional")) return;

            Regex regex = new Regex(@"[\d]([.,][\d])?");
            string adicional = string.Empty;
            adicional = dgvCostosAdicionales.Rows[e.RowIndex].Cells["Costo"].Value.ToString();

            error.Clear();
            if (!regex.IsMatch(adicional))
            {
                error.SetError(dgvCostosAdicionales, "Debe ingresar un Costo Adicional numérico.");
            }
            else
            {
                dgvCostosAdicionales.Rows[e.RowIndex].Cells["Costo"].Value = n.AgregarDecimales(adicional);

                int id = Convert.ToInt32(dgvCostosAdicionales.Rows[e.RowIndex].Cells["id"].Value);
                adicionalesL.SingleOrDefault(r => r.id == id).costo_adicional = Convert.ToDouble(n.AgregarDecimales(adicional));
            }
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            if (ValidarControles() == true)
            {


                //foreach(DataGridViewRow fila in dgvCostosAdicionales.Rows)
                //{
                //    AdicionalPlan adicional = new AdicionalPlan();

                //    adicional.edad_desde = Convert.ToInt32(fila.Cells["EdadDesde"].Value);
                //    adicional.edad_hasta = Convert.ToInt32(fila.Cells["EdadHasta"].Value);
                //    adicional.costo_adicional = Convert.ToDecimal(fila.Cells["Costo"].Value);

                //    adicionalesL.Add(adicional);
                //}


                if (string.IsNullOrEmpty(operacion))
                {
                    InsertarPlan();
                }
                else //MODIFICAR
                {
                    if (operacion == "EDITAR")
                    {
                        ModificarPlan();
                    }
                }
            }
        }

        private Boolean ValidarControles()
        {
            bool resultado = true;
            error.Clear();

            if (string.IsNullOrEmpty(txtNombre.Text))
            {
                resultado = false;
                error.SetError(txtNombre, "El campo Nombre no puede ser vacio.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtDescripcion.Text))
            {
                resultado = false;
                error.SetError(txtDescripcion, "El campo Descripción no puede ser vacio.");
                return resultado;
            }

            if (string.IsNullOrEmpty(txtCostoBase.Text))
            {
                resultado = false;
                error.SetError(txtCostoBase, "El campo Costo Base no puede ser vacio.");
                return resultado;
            }

            if (!numerico.IsMatch(txtCostoBase.Text))
            {
                resultado = false;
                error.SetError(txtCostoBase, "El campo Costo Base debe ser un número mayor a 0.");
                return resultado;
            }

            //TITULAR
            if (string.IsNullOrEmpty(txtEdadTitular.Text))
            {
                resultado = false;
                error.SetError(txtEdadTitular, "El campo Edad Hasta del titular no puede ser vacio.");
                return resultado;
            }

            if (!numerico.IsMatch(txtEdadTitular.Text))
            {
                resultado = false;
                error.SetError(txtEdadTitular, "El campo Edad Hasta del titular debe ser un número mayor a 0.");
                return resultado;
            }

            //CONYUGE
            if (chkConyuge.CheckState == CheckState.Checked)
            {
                if (string.IsNullOrEmpty(txtEdadConyuge.Text))
                {
                    resultado = false;
                    error.SetError(txtEdadConyuge, "El campo Edad Hasta del conyuge no puede ser vacio.");
                    return resultado;
                }

                if (!numerico.IsMatch(txtEdadConyuge.Text))
                {
                    resultado = false;
                    error.SetError(txtEdadConyuge, "El campo Edad Hasta del conyuge debe ser un número mayor a 0.");
                    return resultado;
                }
            }
            else
            {
                txtEdadConyuge.Text = "0";
            }

            //HIJOS
            if (chkHijos.CheckState == CheckState.Checked)
            {
                if (string.IsNullOrEmpty(txtCantHijos.Text))
                {
                    resultado = false;
                    error.SetError(txtCantHijos, "El campo Cantidad de hijos no puede ser vacio.");
                    return resultado;
                }

                if (!numerico.IsMatch(txtCantHijos.Text))
                {
                    resultado = false;
                    error.SetError(txtCantHijos, "El campo Cantidad de hijos debe ser un número mayor a 0.");
                    return resultado;
                }

                if (string.IsNullOrEmpty(txtEdadHijos.Text))
                {
                    resultado = false;
                    error.SetError(txtEdadHijos, "El campo Edad Hasta de los hijos no puede ser vacio.");
                    return resultado;
                }

                if (!numerico.IsMatch(txtEdadHijos.Text))
                {
                    resultado = false;
                    error.SetError(txtEdadHijos, "El campo Edad Hasta de los hijos debe ser un número mayor a 0.");
                    return resultado;
                }
            }
            else
            {
                txtCantHijos.Text = "0";
                txtEdadHijos.Text = "0";
            }

            //OTROS
            if (chkOtros.CheckState == CheckState.Checked)
            {
                if (string.IsNullOrEmpty(txtCantOtros.Text))
                {
                    resultado = false;
                    error.SetError(txtCantOtros, "El campo Cantidad de otros adherentes no puede ser vacio.");
                    return resultado;
                }

                if (!numerico.IsMatch(txtCantOtros.Text))
                {
                    resultado = false;
                    error.SetError(txtCantOtros, "El campo Cantidad de otros adherentes debe ser un número mayor a 0.");
                    return resultado;
                }

                if (string.IsNullOrEmpty(txtEdadOtros.Text))
                {
                    resultado = false;
                    error.SetError(txtEdadOtros, "El campo Edad Hasta de otros adherentes no puede ser vacio.");
                    return resultado;
                }

                if (!numerico.IsMatch(txtEdadOtros.Text))
                {
                    resultado = false;
                    error.SetError(txtEdadOtros, "El campo Edad Hasta de otros adherentes debe ser un número mayor a 0.");
                    return resultado;
                }
            }
            else
            {
                txtCantOtros.Text = "0";
                txtEdadOtros.Text = "0";
            }

            if (dgvCostosAdicionales == null)
            {
                resultado = false;
                error.SetError(dgvCostosAdicionales, "Los costos adicionales no pueden ser vacios.");
                return resultado;
            }

            return resultado;
        }

        private void InsertarPlan()
        {
            try
            {
                Plan plan = new Plan();
                plan.nombre = txtNombre.Text.ToUpper();
                plan.descripcion = txtDescripcion.Text.ToUpper();
                plan.costo_base = Convert.ToDouble(n.AgregarDecimales(txtCostoBase.Text));
                plan.activo = Convert.ToInt32(chkActivo.CheckState);
                plan.recargo = Convert.ToInt32(chkRecargo.CheckState);
                plan.titular = 1;
                plan.edad_titular = Convert.ToInt32(txtEdadTitular.Text);
                plan.conyuge = Convert.ToInt32(chkConyuge.CheckState);
                plan.edad_conyuge = Convert.ToInt32(txtEdadConyuge.Text);
                plan.hijos = Convert.ToInt32(chkHijos.CheckState);
                plan.cantidad_hijos = Convert.ToInt32(txtCantHijos.Text);
                plan.edad_hijos = Convert.ToInt32(txtEdadHijos.Text);
                plan.otros = Convert.ToInt32(chkOtros.CheckState);
                plan.cantidad_otros = Convert.ToInt32(txtCantOtros.Text);
                plan.edad_otros = Convert.ToInt32(txtEdadOtros.Text);

                plan.adicionales = adicionalesL;

                int resultado = Planes.AddPlan(plan);
                if (resultado > 0)
                {
                    MessageBox.Show("Los datos se registraron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    inicializar();
                }
                else
                {
                    MessageBox.Show("Ocurrio un error al registrar los datos. Intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void ModificarPlan()
        {
            try
            {
                Plan plan = new Plan();
                plan.id = plan_id;
                plan.nombre = txtNombre.Text.ToUpper();
                plan.descripcion = txtDescripcion.Text.ToUpper();
                plan.costo_base = Convert.ToDouble(n.AgregarDecimales(txtCostoBase.Text));
                plan.activo = Convert.ToInt32(chkActivo.CheckState);
                plan.recargo = Convert.ToInt32(chkRecargo.CheckState);
                plan.titular = 1;
                plan.edad_titular = Convert.ToInt32(txtEdadTitular.Text);
                plan.conyuge = Convert.ToInt32(chkConyuge.CheckState);
                plan.edad_conyuge = Convert.ToInt32(txtEdadConyuge.Text);
                plan.hijos = Convert.ToInt32(chkHijos.CheckState);
                plan.cantidad_hijos = Convert.ToInt32(txtCantHijos.Text);
                plan.edad_hijos = Convert.ToInt32(txtEdadHijos.Text);
                plan.otros = Convert.ToInt32(chkOtros.CheckState);
                plan.cantidad_otros = Convert.ToInt32(txtCantOtros.Text);
                plan.edad_otros = Convert.ToInt32(txtEdadOtros.Text);

                plan.adicionales = adicionalesL;

                int resultado = Planes.Modify(plan, adicionalesEliminar);
                if (resultado > 0)
                {
                    MessageBox.Show("Los datos se registraron correctamente.", "Información", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    inicializar();
                }
                else
                {
                    MessageBox.Show("Ocurrio un error al registrar los datos. Intente nuevamente.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        private void btnSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }
    }
}
